package Interfaz;

import estructuras.*;
import fuente.Usuario;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

/**
 * Interfaz gráfica del usuario (GUI).
 * @author Alexandre
 * @author Rodrigo
 * @author Gabriel
 * @author Jeremy
 */

public class Ventana extends javax.swing.JFrame {

    private Usuario _cliente;//Objeto que comunica las interacciones del usuario con la logica.
    private String _compuertaSeleccionada;//Almacena el nombre de la compuerta seleccionada por el usuario para crear en el panel.
    private int _contadorCompuertasAND;//Mantiene cuenta de la cantidad de compuertasAND creadas, para añadir un identificador al nombre gráficamente.
    private int _contadorCompuertasNAND;//Mantiene cuenta de la cantidad de compuertasNAND creadas, para añadir un identificador al nombre gráficamente .    
    private int _contadorCompuertasOR;//Mantiene cuenta de la cantidad de compuertasOR creadas, para añadir un identificador al nombre gráficamente.
    private int _contadorCompuertasNOR;//Mantiene cuenta de la cantidad de compuertasNOR creadas, para añadir un identificador al nombre gráficamente.
    private int _contadorCompuertasNOT;//Mantiene cuenta de la cantidad de compuertasNOT creadas, para añadir un identificador al nombre gráficamente.
    private int _contadorCompuertasXOR;//Mantiene cuenta de la cantidad de compuertasXOR creadas, para añadir un identificador al nombre gráficamente.
    private int _contadorCompuertasXNOR;//Mantiene cuenta de la cantidad de compuertasXNOR creadas, para añadir un identificador al nombre gráficamente.
    
    /**
     * Constructor,
     * Crea una nueva ventana, inicializa el objeto cliente, Inicializa el
     * contador de las compuertas en 1 y añade los radio buttons al conjunto
     * que selecciona el nodo fuente para crear una conexión.
     */
    public Ventana() {
        initComponents();        
        setup(); 
        _cliente = new Usuario();
        _compuertaSeleccionada = "";
        _contadorCompuertasAND = _contadorCompuertasNAND = _contadorCompuertasOR = 
        _contadorCompuertasNOR = _contadorCompuertasNOT = _contadorCompuertasXOR = 
        _contadorCompuertasXNOR = 1;
        
        buttonGroup.add(jRadioButtonVCC);
        buttonGroup.add(jRadioButtonGND);
        buttonGroup.add(jRadioButtonGATE);
    }

    /**
     * Este método es llamado desde el constructor para inicializar
     * los componentes de la interfaz gráfica.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jFrameNuevo = new javax.swing.JFrame();
        jButtonAceptarNuevo = new javax.swing.JButton();
        jButtonCancelar = new javax.swing.JButton();
        jTextFieldNombreA = new javax.swing.JTextField();
        jLabelNombreA = new javax.swing.JLabel();
        jLabelDescripcion = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jLabelNEntradas = new javax.swing.JLabel();
        jSpinnerNEntradas = new javax.swing.JSpinner();
        jFrameConexion = new javax.swing.JFrame();
        jColorChooser = new javax.swing.JColorChooser();
        jLabel2 = new javax.swing.JLabel();
        jTextFieldDestino = new javax.swing.JTextField();
        jCheckBoxSalida = new javax.swing.JCheckBox();
        jButtonAceptarConexion = new javax.swing.JButton();
        jButtonCancelarConexion = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JSeparator();
        jPanel1 = new javax.swing.JPanel();
        jTextFieldFuente = new javax.swing.JTextField();
        jRadioButtonGATE = new javax.swing.JRadioButton();
        jRadioButtonGND = new javax.swing.JRadioButton();
        jRadioButtonVCC = new javax.swing.JRadioButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        buttonGroup = new javax.swing.ButtonGroup();
        jPanelMenu = new javax.swing.JPanel();
        jComboBoxCompuertas = new javax.swing.JComboBox();
        jLabelImagen = new javax.swing.JLabel();
        jPanelPropiedades = new javax.swing.JPanel();
        jScrollPane3 = new javax.swing.JScrollPane();
        jTextAreaPropiedades = new javax.swing.JTextArea();
        jTextFieldPropiedades = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jButtonBuscar = new javax.swing.JButton();
        jButtonConexión = new javax.swing.JButton();
        jScrollPanel = new javax.swing.JScrollPane();
        jPanelPrincipal = new javax.swing.JPanel();
        jButtonSimular = new javax.swing.JButton();
        jMenuBarra = new javax.swing.JMenuBar();
        jMenuArchivo = new javax.swing.JMenu();
        jMenuNuevo = new javax.swing.JMenuItem();
        jMenuCargar = new javax.swing.JMenuItem();
        jMenuGuardar = new javax.swing.JMenuItem();
        jMenuSalir = new javax.swing.JMenuItem();

        jFrameNuevo.setTitle("Crear Archivo");
        jFrameNuevo.setAlwaysOnTop(true);
        jFrameNuevo.setMinimumSize(new java.awt.Dimension(400, 357));
        jFrameNuevo.setResizable(false);

        jButtonAceptarNuevo.setText("Aceptar");
        jButtonAceptarNuevo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonAceptarNuevoActionPerformed(evt);
            }
        });

        jButtonCancelar.setText("Cancelar");
        jButtonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonCancelarActionPerformed(evt);
            }
        });

        jLabelNombreA.setText("Nombre del Archivo");

        jLabelDescripcion.setText("Descripción");

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        jLabelNEntradas.setText("Número de Entradas");
        jLabelNEntradas.setToolTipText("");

        jSpinnerNEntradas.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1)));
        jSpinnerNEntradas.setToolTipText("Cantidad de entradas que tendra el diseño logico.");

        javax.swing.GroupLayout jFrameNuevoLayout = new javax.swing.GroupLayout(jFrameNuevo.getContentPane());
        jFrameNuevo.getContentPane().setLayout(jFrameNuevoLayout);
        jFrameNuevoLayout.setHorizontalGroup(
            jFrameNuevoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jFrameNuevoLayout.createSequentialGroup()
                .addGap(69, 69, 69)
                .addComponent(jButtonAceptarNuevo)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 100, Short.MAX_VALUE)
                .addComponent(jButtonCancelar)
                .addGap(85, 85, 85))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jFrameNuevoLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jFrameNuevoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelDescripcion, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jFrameNuevoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(jTextFieldNombreA)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 345, Short.MAX_VALUE)
                        .addComponent(jLabelNombreA, javax.swing.GroupLayout.Alignment.LEADING))
                    .addGroup(jFrameNuevoLayout.createSequentialGroup()
                        .addComponent(jLabelNEntradas)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jSpinnerNEntradas, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(25, 25, 25))
        );
        jFrameNuevoLayout.setVerticalGroup(
            jFrameNuevoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jFrameNuevoLayout.createSequentialGroup()
                .addGap(9, 9, 9)
                .addComponent(jLabelNombreA, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldNombreA, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(jFrameNuevoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelNEntradas, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jSpinnerNEntradas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabelDescripcion, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addGroup(jFrameNuevoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonAceptarNuevo)
                    .addComponent(jButtonCancelar))
                .addGap(20, 20, 20))
        );

        jFrameConexion.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        jFrameConexion.setTitle("Crear conexion entre compuertas");
        jFrameConexion.setMinimumSize(new java.awt.Dimension(635, 679));
        jFrameConexion.setResizable(false);

        jColorChooser.setCursor(new java.awt.Cursor(java.awt.Cursor.CROSSHAIR_CURSOR));

        jLabel2.setText("Compuerta destino:");

        jCheckBoxSalida.setText("Salida de diseño");
        jCheckBoxSalida.setToolTipText("Marcar si es salida total del diseño");

        jButtonAceptarConexion.setText("Aceptar");
        jButtonAceptarConexion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonAceptarConexionActionPerformed(evt);
            }
        });

        jButtonCancelarConexion.setText("Cancelar");
        jButtonCancelarConexion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonCancelarConexionActionPerformed(evt);
            }
        });

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Compuerta fuente"));

        jTextFieldFuente.setEnabled(false);

        jRadioButtonGATE.setText("Compuerta");
        jRadioButtonGATE.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jRadioButtonGATEItemStateChanged(evt);
            }
        });

        jRadioButtonGND.setText("GND");

        jRadioButtonVCC.setText("VCC");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jTextFieldFuente, javax.swing.GroupLayout.PREFERRED_SIZE, 152, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(45, 45, 45)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jRadioButtonGATE)
                    .addComponent(jRadioButtonGND)
                    .addComponent(jRadioButtonVCC))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(12, Short.MAX_VALUE)
                .addComponent(jRadioButtonVCC)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jRadioButtonGND)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jRadioButtonGATE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jTextFieldFuente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        javax.swing.GroupLayout jFrameConexionLayout = new javax.swing.GroupLayout(jFrameConexion.getContentPane());
        jFrameConexion.getContentPane().setLayout(jFrameConexionLayout);
        jFrameConexionLayout.setHorizontalGroup(
            jFrameConexionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jFrameConexionLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldDestino, javax.swing.GroupLayout.PREFERRED_SIZE, 152, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jCheckBoxSalida)
                .addGap(126, 126, 126))
            .addGroup(jFrameConexionLayout.createSequentialGroup()
                .addGroup(jFrameConexionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jFrameConexionLayout.createSequentialGroup()
                        .addGap(195, 195, 195)
                        .addComponent(jButtonAceptarConexion)
                        .addGap(81, 81, 81)
                        .addComponent(jButtonCancelarConexion))
                    .addGroup(jFrameConexionLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jFrameConexionLayout.createSequentialGroup()
                        .addGap(220, 220, 220)
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jFrameConexionLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jColorChooser, javax.swing.GroupLayout.PREFERRED_SIZE, 641, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jFrameConexionLayout.setVerticalGroup(
            jFrameConexionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jFrameConexionLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(26, 26, 26)
                .addGroup(jFrameConexionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jCheckBoxSalida)
                    .addComponent(jTextFieldDestino, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jFrameConexionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonAceptarConexion)
                    .addComponent(jButtonCancelarConexion))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jColorChooser, javax.swing.GroupLayout.DEFAULT_SIZE, 427, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane2.setViewportView(jTable1);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("LogiCTec");
        setResizable(false);

        jComboBoxCompuertas.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Elija la Compuerta", "AND", "NAND", "NOR", "NOT", "OR", "XNOR", "XOR" }));
        jComboBoxCompuertas.setEnabled(false);
        jComboBoxCompuertas.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboBoxCompuertasItemStateChanged(evt);
            }
        });

        jLabelImagen.setBorder(javax.swing.BorderFactory.createTitledBorder("Vista Previa"));

        jPanelPropiedades.setBorder(javax.swing.BorderFactory.createTitledBorder("Propiedades"));

        jTextAreaPropiedades.setEditable(false);
        jTextAreaPropiedades.setColumns(20);
        jTextAreaPropiedades.setRows(5);
        jScrollPane3.setViewportView(jTextAreaPropiedades);

        jTextFieldPropiedades.setToolTipText("Escriba el nombre de la compuerta para mostrar sus caracteristicas actuales");

        jLabel1.setText("Compuerta:");
        jLabel1.setToolTipText("Escriba el nombre de la compuerta para mostrar sus caracteristicas actuales");

        jButtonBuscar.setText("Buscar");
        jButtonBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonBuscarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelPropiedadesLayout = new javax.swing.GroupLayout(jPanelPropiedades);
        jPanelPropiedades.setLayout(jPanelPropiedadesLayout);
        jPanelPropiedadesLayout.setHorizontalGroup(
            jPanelPropiedadesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane3)
            .addGroup(jPanelPropiedadesLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jTextFieldPropiedades, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButtonBuscar)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelPropiedadesLayout.setVerticalGroup(
            jPanelPropiedadesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelPropiedadesLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelPropiedadesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextFieldPropiedades, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButtonBuscar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 17, Short.MAX_VALUE)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 282, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        jButtonConexión.setText("Crear conexión");
        jButtonConexión.setEnabled(false);
        jButtonConexión.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonConexiónActionPerformed(evt);
            }
        });

        jScrollPanel.setMaximumSize(new java.awt.Dimension(1000, 600));
        jScrollPanel.setPreferredSize(new java.awt.Dimension(900, 600));

        jPanelPrincipal.setBackground(new java.awt.Color(255, 255, 255));
        jPanelPrincipal.setEnabled(false);
        jPanelPrincipal.setPreferredSize(new java.awt.Dimension(2000, 1000));
        jPanelPrincipal.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jPanelPrincipalMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout jPanelPrincipalLayout = new javax.swing.GroupLayout(jPanelPrincipal);
        jPanelPrincipal.setLayout(jPanelPrincipalLayout);
        jPanelPrincipalLayout.setHorizontalGroup(
            jPanelPrincipalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 2000, Short.MAX_VALUE)
        );
        jPanelPrincipalLayout.setVerticalGroup(
            jPanelPrincipalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 1000, Short.MAX_VALUE)
        );

        jScrollPanel.setViewportView(jPanelPrincipal);

        jButtonSimular.setText("Simular");
        jButtonSimular.setEnabled(false);
        jButtonSimular.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonSimularActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelMenuLayout = new javax.swing.GroupLayout(jPanelMenu);
        jPanelMenu.setLayout(jPanelMenuLayout);
        jPanelMenuLayout.setHorizontalGroup(
            jPanelMenuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelMenuLayout.createSequentialGroup()
                .addGroup(jPanelMenuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jComboBoxCompuertas, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelImagen, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanelMenuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addGroup(jPanelMenuLayout.createSequentialGroup()
                            .addGap(20, 20, 20)
                            .addComponent(jButtonSimular)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButtonConexión))
                        .addComponent(jPanelPropiedades, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(31, 31, 31)
                .addComponent(jScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 913, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelMenuLayout.setVerticalGroup(
            jPanelMenuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelMenuLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jComboBoxCompuertas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(41, 41, 41)
                .addComponent(jLabelImagen, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(jPanelMenuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonConexión)
                    .addComponent(jButtonSimular))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jPanelPropiedades, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(jPanelMenuLayout.createSequentialGroup()
                .addComponent(jScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 7, Short.MAX_VALUE))
        );

        jMenuArchivo.setText("Archivo");

        jMenuNuevo.setText("Nuevo");
        jMenuNuevo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuNuevoActionPerformed(evt);
            }
        });
        jMenuArchivo.add(jMenuNuevo);

        jMenuCargar.setText("Cargar");
        jMenuArchivo.add(jMenuCargar);

        jMenuGuardar.setText("Guardar");
        jMenuGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuGuardarActionPerformed(evt);
            }
        });
        jMenuArchivo.add(jMenuGuardar);

        jMenuSalir.setText("Salir");
        jMenuSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuSalirActionPerformed(evt);
            }
        });
        jMenuArchivo.add(jMenuSalir);

        jMenuBarra.add(jMenuArchivo);

        setJMenuBar(jMenuBarra);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanelMenu, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanelMenu, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    
    //////////////Métodos de acciones y eventos de los componentes//////////////
    /**
     * Inicia una nueva ventana con las opciones para que el 
     * ususario comience un nuevo diseño lógico.
     * @param evt Evento ejecutable al presionar el boton
     */
    private void jMenuNuevoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuNuevoActionPerformed
          menuNuevo();
    }//GEN-LAST:event_jMenuNuevoActionPerformed
    
    /**
     * Evento del boton aceptar de la ventana de pciones para comenzar un nuevo diseño,
     * Inicializa el objeto Usuario con los parámetros necesarios para almacenar
     * y ejecutar sus funciones y métodos.
     * @param evt Evento ejecutable al presionar el boton
     */
    private void jButtonAceptarNuevoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAceptarNuevoActionPerformed
        JLabel VCC = new JLabel("VCC");
        VCC.setHorizontalAlignment(JLabel.CENTER);
        VCC.setBorder(javax.swing.BorderFactory.createLineBorder(Color.black));    
        VCC.setBounds(60, 130, 60, 60);
        jPanelPrincipal.add(VCC);
        _cliente.crearCompuerta("VCC", 120, 190);
        
        JLabel GND = new JLabel("GND");
        GND.setHorizontalAlignment(JLabel.CENTER);
        GND.setBorder(javax.swing.BorderFactory.createLineBorder(Color.black));    
        GND.setBounds(60, 350, 60, 60);
        jPanelPrincipal.add(GND);
        _cliente.crearCompuerta("GND", 120, 410);
        jPanelPrincipal.setEnabled(true);        
        jPanelPrincipal.repaint();    
        
        setCliente();
        
        jComboBoxCompuertas.setEnabled(true);
        jButtonConexión.setEnabled(true);
        jButtonSimular.setEnabled(true);
    }//GEN-LAST:event_jButtonAceptarNuevoActionPerformed

    /**
     * Eento del boton de la ventana de opciones para comenzar un nuevo diseño,
     * cancela y cierra la ventana.
     * @param evt Evento ejecutable al presionar el boton
     */
    private void jButtonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCancelarActionPerformed
        jFrameNuevo.dispose();
        jTextArea1.setText(null);
        jTextFieldNombreA.setText(null);
        jSpinnerNEntradas.setValue(1);
    }//GEN-LAST:event_jButtonCancelarActionPerformed

    /**
     * Evento que ejecuta el comboBox que se encuentra en la ventana principal, 
     * llama a métodos auxiliares para ejecutar una acción al cambiar el item
     * en el componente, y almacena este cambio en la variable _compuertaSeleccionada.
     * @param evt Evento ejecutable
     */
    private void jComboBoxCompuertasItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jComboBoxCompuertasItemStateChanged
        try {
            _compuertaSeleccionada = (String) jComboBoxCompuertas.getSelectedItem();
            setVistaPreviaCompuerta();
        } catch (IOException ex) {
            Logger.getLogger(Ventana.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_jComboBoxCompuertasItemStateChanged

    /**
     * Ejecuta acciones al presionar el click derecho del mouse en el panel
     * principal del editor.
     * @param evt Evento ejecutable
     */
    private void jPanelPrincipalMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jPanelPrincipalMouseClicked
        /* Crear el componente gráficamente. */
        crearCompuertaGrafica();
        System.out.println(jPanelPrincipal.getMousePosition().x+"----"+jPanelPrincipal.getMousePosition().y);
        _cliente.crearCompuerta(_compuertaSeleccionada, jPanelPrincipal.getMousePosition().x, jPanelPrincipal.getMousePosition().y);
    }//GEN-LAST:event_jPanelPrincipalMouseClicked

    /**
     * Evento del boton cancelar de la ventana crear nueva conexion
     * @param evt Evento ejecutable
     */
    private void jButtonCancelarConexionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCancelarConexionActionPerformed
        jFrameConexion.dispose();
        jTextFieldFuente.setText("");
        jTextFieldDestino.setText("");
        jPanelPrincipal.setEnabled(true);
    }//GEN-LAST:event_jButtonCancelarConexionActionPerformed

    /**
     * Ejecuta las acciones correspondientes al presionar el boton aceptar de
     * la ventana de agregar conexion
     * @param evt Evento ejecutable
     */
    private void jButtonAceptarConexionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAceptarConexionActionPerformed
        if (!(jTextFieldDestino.getText().equals("")) && !(jColorChooser.getColor().equals(Color.white))){
            if (jTextFieldDestino.getText().equals("GND")||jTextFieldDestino.getText().equals("VCC")) {
                JOptionPane.showMessageDialog(null, "ERROR: No se pueden hacer conexiones"
                                              + "entre VCC y GND", "Error", JOptionPane.ERROR_MESSAGE);
            }
            else {
                if (jCheckBoxSalida.isSelected()) {
                    if (verificarCompuertaSalida(jTextFieldDestino.getText())) {
                        JOptionPane.showMessageDialog(null, "ERROR: Esta compuerta ya ha sido definida como salida"
                                                      ,"Error", JOptionPane.ERROR_MESSAGE);
                        
                    }
                }

                crearConexionGrafica();
                crearConexionLogica();

                jFrameConexion.dispose();
                jTextFieldDestino.setText("");
                jTextFieldFuente.setText("");
            }
        } 
        else{
            JOptionPane.showMessageDialog(null, "ERROR: No se pueden hacer conexiones" + "\n"
                                              + "Verifique Compuerta Destino Sea Valido" + "\n"
                                              + "Color Seleccionado: Distinto de Blanco", "Error", JOptionPane.ERROR_MESSAGE);
            
        }
    }//GEN-LAST:event_jButtonAceptarConexionActionPerformed

    /**
     * Ejecuta las acciones correspondientes al presionar el boton crear conexion de
     * la ventana principal
     * @param evt Evento ejecutable
     */
    private void jButtonConexiónActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonConexiónActionPerformed
        jFrameConexion.setVisible(true);
        jPanelPrincipal.setEnabled(false);
    }//GEN-LAST:event_jButtonConexiónActionPerformed

    /**
     * Ejecuta el evento del radio button qus selecciona la opcion
     * de una una compuerta como fuente, activa la casilla para
     * escribir el nombre de la compuerta.
     * @param evt Evento ejecutable
     */
    private void jRadioButtonGATEItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jRadioButtonGATEItemStateChanged
        if (jRadioButtonGATE.isSelected()) {
            jTextFieldFuente.setEnabled(true);
        }
        else {
            jTextFieldFuente.setEnabled(false);
        }
    }//GEN-LAST:event_jRadioButtonGATEItemStateChanged

    /**
     * Ejecuta el evento del boton qus despliega las opciones para crear
     * una conexión entre compuertas
     * @param evt Evento ejecutable
     */
    private void jButtonSimularActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonSimularActionPerformed
        String listaSalidas = simular();
        
        System.out.println(listaSalidas);
        JOptionPane.showMessageDialog(null, "LAS SALIDAS DEL DISEÑO SON: "+"\n"
                + ""+listaSalidas, "Salidas del diseño", JOptionPane.ERROR_MESSAGE);
    }//GEN-LAST:event_jButtonSimularActionPerformed

    /**
     * Evento que cierra el programa
     * @param evt Evento a ejecutar
     */
    private void jMenuSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuSalirActionPerformed
        this.dispose();
    }//GEN-LAST:event_jMenuSalirActionPerformed

    /**
     * Ejecuta la accion del boton buscar para mostrar las propiedades
     * de una compuerta
     * @param evt Evento a ejecutar
     */
    private void jButtonBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonBuscarActionPerformed
        jTextAreaPropiedades.setText("");
        
        String compuerta = jTextFieldPropiedades.getText();
        
        mostrarPropiedades(compuerta);
    }//GEN-LAST:event_jButtonBuscarActionPerformed

    /**
     * Evento que abre las opciones para guardar un diseño.
     * @param evt Evento a ejecutar
     */
    private void jMenuGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuGuardarActionPerformed
        _cliente.guardar();
        
        JOptionPane.showMessageDialog(null, "El diseño se guardo correctamente "
                + "en la carpeta fuente como archivo .XML"
               , "Guardado", JOptionPane.INFORMATION_MESSAGE);
    }//GEN-LAST:event_jMenuGuardarActionPerformed
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * Muestra en una area de tecto las caracteristicas de una compuerta especificada por el usuario
     * @param pNombre Nombre de la compuerta a mostrar caracteristicas
     */
    private void mostrarPropiedades(String pNombre) {
        ANBNode n = _cliente.encontrarCompuerta(pNombre);
        
        if (n == null) {
            JOptionPane.showMessageDialog(null, "ERROR: No se encuentra el nodo especificado"
               , "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        else {
            String nodoDestino;
            if (n.getPadre() == null) {
                nodoDestino = "No hay";
            }
            else{
                nodoDestino = n.getPadre().getCompuertaGraf();
            }
        
            String listaCompuertasEntradas = obtenerHijosString(n);
            String nombreGraf = n.getCompuertaGraf();
            String nombreComp = n.getCompuertaName();
        
            jTextAreaPropiedades.append("Nombre Grafico: "+nombreGraf+"\n");
            jTextAreaPropiedades.append("Nombre de Compuerta: "+nombreComp+"\n");
            jTextAreaPropiedades.append("Compuertas de las cuales recibe datos: "+listaCompuertasEntradas+"\n");
            jTextAreaPropiedades.append("Compuerta hacia la cual envía dato: "+nodoDestino+"\n");
        }
    }   
    
    /**
     * Obtiene las compuertas de la lista de hijos de una especificada,
     * para mostrarla en representacion de string.
     * @param pN Compuerta de la cual extraer hijos
     * @return Representacion en string de los hijos
     */
    private String obtenerHijosString (ANBNode pN) {
        String cadena = "";
        
        SLL listaHijos = pN.getHijos();
        
        for (SLLNode nodo = listaHijos.getHead(); nodo != null; nodo = nodo.getNext()) {
            ANBNode nodoHijo = (ANBNode) nodo.getElemento();
            
            String nombre = nodoHijo.getCompuertaGraf();
            
            cadena = cadena+"-"+nombre;
        }
        return cadena;
    }
            
    /**
     * Verifica si una compuerta destino está en la lista de compuertas
     * creadas por el usuario.
     * @param pNombreDest Nombre de la compuerta a verificar
     * @return true si se encuentra, false si no.
     */
    private boolean verificarCompuertaSalida(String pNombreDest) {
        ANBNode n = _cliente.encontrarCompuerta(pNombreDest);
        
        return _cliente.isEnListaSalidas(n);
    }
    
    /**
     * Obtiene la salida definitiva del diseño.
     * @return lista de salidas de acuerdo a la cantidad que halla definido el usuario
     */
    private String simular() {
        SLL lista = _cliente.simular();
        String salidas = "";
        
        for (SLLNode n = lista.getHead(); n != null; n = n.getNext()) {
            int valor = (int) n.getElemento();
            System.out.println(valor);
            
            salidas = salidas+valor+", ";
        }
        return salidas;
    }
    
    /**
     * Crea una linea de conexion en la interfaz de usuario.
     */
    private void crearConexionLogica() {
        if (jRadioButtonVCC.isSelected()) {
            ANBNode dest = _cliente.encontrarCompuerta(jTextFieldDestino.getText());
            if (dest==null){
                System.out.println("Nodo destino no valido");
            }
            else{
                _cliente.crearEntrada(dest, true, 0, 0, jCheckBoxSalida.isSelected());
            }
           
        }
        else if (jRadioButtonGND.isSelected()) {
            ANBNode dest = _cliente.encontrarCompuerta(jTextFieldDestino.getText());
            if (dest==null){
                System.out.println("Nodo destino no valido");
            }
            else{
                _cliente.crearEntrada(dest, false, 0, 0, jCheckBoxSalida.isSelected());
            }
            
        }
        else {
            _cliente.crearConexión(jTextFieldFuente.getText(), 
                                   jTextFieldDestino.getText(), jCheckBoxSalida.isSelected());
        }
    }
    
    /**
     * Crea una conexion graficamente en la interfaz de usuario.
     */
    private void crearConexionGrafica() {
            String nDestino = jTextFieldDestino.getText();        
            ANBNode destino = _cliente.encontrarCompuerta(nDestino);
            String nFuente = jTextFieldFuente.getText();
            ANBNode fuente = _cliente.encontrarCompuerta(nFuente);
            if (destino != null){
                if (jRadioButtonVCC.isSelected()) {

                    int posX2 = destino.getPosX();
                    int posY2 = destino.getPosY();

                    Grid.dibujarConexion(jPanelPrincipal.getGraphics(), 120, 160, posX2, posY2, jColorChooser.getColor());

                } else if (jRadioButtonGND.isSelected()) {

                    int posX2 = destino.getPosX();
                    int posY2 = destino.getPosY();

                    Grid.dibujarConexion(jPanelPrincipal.getGraphics(), 120, 380, posX2, posY2, jColorChooser.getColor());
                } else {
                    if (fuente != null && !(jRadioButtonVCC.isSelected()) && !(jRadioButtonGND.isSelected())){
                        int posX1 = fuente.getPosX();
                        int posY1 = fuente.getPosY();
                        int posX2 = destino.getPosX();
                        int posY2 = destino.getPosY();

                        System.out.println(posX1 + "//" + posY1 + "//" + posX2 + "//" + posY2);

                    Grid.dibujarConexion(jPanelPrincipal.getGraphics(), posX1, posY1, posX2, posY2, jColorChooser.getColor());
                }    
                    else{
                        JOptionPane.showMessageDialog(null, "Verifique que el nombre de las Compuerta fuente sea valido","Error en Compuertas", JOptionPane.WARNING_MESSAGE);
                    }
                                    
               }
            }
            else {
            JOptionPane.showMessageDialog(null, "Verifique que el nombre de las Compuerta destino sea valido","Error en Compuertas", JOptionPane.WARNING_MESSAGE);
            }
    }
    
    /**
     * Crea una compuerta gráficamente en el panel principal, en forma de label.
     */
    private void crearCompuertaGrafica() {
        int cont = 0;
        switch (_compuertaSeleccionada) {
            case "AND":
                cont = _contadorCompuertasAND;
                _contadorCompuertasAND++;
                break;
            case "NAND":
                cont = _contadorCompuertasNAND;
                _contadorCompuertasNAND++;
                break;
            case "OR":
                cont = _contadorCompuertasOR;
                _contadorCompuertasOR++;
                break;
            case "NOR":
                cont = _contadorCompuertasNOR;
                _contadorCompuertasNOR++;
                break;
            case "NOT":
                cont = _contadorCompuertasNOT;
                _contadorCompuertasNOT++;
                break;
            case "XOR":
                cont = _contadorCompuertasXOR;
                _contadorCompuertasXOR++;
                break;
            case "XNOR":
                cont = _contadorCompuertasXNOR;
                _contadorCompuertasXNOR++;
                break;
        }
        if (cont != 0){           
        
        JLabel compuerta = new JLabel(_compuertaSeleccionada+cont);
        compuerta.setHorizontalAlignment(JLabel.CENTER);
        compuerta.setBorder(javax.swing.BorderFactory.createLineBorder(Color.black));
        
        int posX = (jPanelPrincipal.getMousePosition().x)-30;
        int posY = (jPanelPrincipal.getMousePosition().y)-30;
        
        compuerta.setBounds(posX, posY, 60, 60);
        jPanelPrincipal.add(compuerta);
        jPanelPrincipal.repaint();
        }
    }
    
    /**
     * Establece una vita previa mostrada en un label, de la imágen que representa
     * la compuerta lógica que va a ser creada.
     * @throws IOException Excepción que se ejecuta al no poder leer el archivo
     */
    private void setVistaPreviaCompuerta() throws IOException {
        Image img = cargarImagenes ();
        
        Image resizedImage = img.getScaledInstance(jLabelImagen.getWidth()-50, jLabelImagen.getHeight()-50, 0);
        ImageIcon icon = new ImageIcon(resizedImage);        
        
        jLabelImagen.setIcon(icon);
    }
   
    
    /**
     * Función auxiliar llamada por el método setVistaPreviaCompuerta,
     * busca en fichero y carga una imágen a partir de su nombre
     * @return Imágen cargada desde un fichero
     * @throws IOException Excepción mostrada al no poder leer un archivo
     */
    private Image cargarImagenes () throws IOException {
        String Nombrecompuerta = (String) jComboBoxCompuertas.getSelectedItem();
        
        File f = new File("src/Imagenes/"+Nombrecompuerta+".jpg");
        Image img = ImageIO.read(f);
        
        return img;
    }
    
    /**
     * Este método es llamado al iniciar un nuevo diseño por parte del usuario
     * Inicializa los atributos del objeto usuario: nombre del diseño,
     * la descripción y la cantidad de entradas.
     */
    private void setCliente() {
        _cliente.setNombre(jTextFieldNombreA.getText());
        _cliente.setDescripcion(jTextArea1.getText());
        _cliente.setEntradas((int) jSpinnerNEntradas.getValue());        
        //System.out.println(_cliente.getEntradas()+_cliente.getDescripcion()+_cliente.getNombre());
        jFrameNuevo.dispose();
        jTextArea1.setText(null);
        jTextFieldNombreA.setText(null);
        jSpinnerNEntradas.setValue(1);
    }
    
    /**
     * Abre la ventana del menu para iniciar un nuevo diseño.
     */
    private void menuNuevo(){        
        jFrameNuevo.setVisible(true);
    }
    
    /**
     * Establece e inicializa la ventana principal.
     */
    private void setup(){
        jPanelPrincipal.setSize(new Dimension(2000, 3000));
        gridVentana();
        this.setLayout(new BorderLayout());
        this.add(jPanelMenu, BorderLayout.WEST);
        this.add(jScrollPanel, BorderLayout.EAST);  
        this.pack();
    }
    
    
    
    /**
     * Metodo que es llamado en el setup() de la interfaz para conseguir el 
     * tamaño de la ventana y poner el tamaño correcto del scroll panel.
     * @return La dimension del scroll panel.
     */
    private Dimension jScrollPanelTamano(){
        Dimension Panel = jPanelPrincipal.getSize();
        int h = (int) Panel.getHeight();
        int w = (int) Panel.getWidth();
        
        w =- 250;
        
        return  new Dimension (w, h);      
    }

    /**
     * Metodo que dibuja puntos en las intersecciones de del panel para 
     * brindar como referecia donde dibujar las lineas e insertar componentes.
     */
    private void gridVentana(){
        Graphics PanelG = jPanelPrincipal.getGraphics();
        Grid.pintar(PanelG);
        Dimension PanelD = jPanelPrincipal.getSize();
    } 
    
    /**
     * Inicia el hilo de ejecución de la interfaz gráfica.
     * @param args Argumentos de la linea de comandos
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        /* Create and display the form */
        // Listen for value changes in the scroll pane's scrollbars
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Ventana().setVisible(true);
            }
        });
    }
     
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup buttonGroup;
    private javax.swing.JButton jButtonAceptarConexion;
    private javax.swing.JButton jButtonAceptarNuevo;
    private javax.swing.JButton jButtonBuscar;
    private javax.swing.JButton jButtonCancelar;
    private javax.swing.JButton jButtonCancelarConexion;
    private javax.swing.JButton jButtonConexión;
    private javax.swing.JButton jButtonSimular;
    private javax.swing.JCheckBox jCheckBoxSalida;
    private javax.swing.JColorChooser jColorChooser;
    private javax.swing.JComboBox jComboBoxCompuertas;
    private javax.swing.JFrame jFrameConexion;
    private javax.swing.JFrame jFrameNuevo;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabelDescripcion;
    private javax.swing.JLabel jLabelImagen;
    private javax.swing.JLabel jLabelNEntradas;
    private javax.swing.JLabel jLabelNombreA;
    private javax.swing.JMenu jMenuArchivo;
    private javax.swing.JMenuBar jMenuBarra;
    private javax.swing.JMenuItem jMenuCargar;
    private javax.swing.JMenuItem jMenuGuardar;
    private javax.swing.JMenuItem jMenuNuevo;
    private javax.swing.JMenuItem jMenuSalir;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanelMenu;
    private javax.swing.JPanel jPanelPrincipal;
    private javax.swing.JPanel jPanelPropiedades;
    private javax.swing.JRadioButton jRadioButtonGATE;
    private javax.swing.JRadioButton jRadioButtonGND;
    private javax.swing.JRadioButton jRadioButtonVCC;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPanel;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSpinner jSpinnerNEntradas;
    private javax.swing.JTable jTable1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextArea jTextAreaPropiedades;
    private javax.swing.JTextField jTextFieldDestino;
    private javax.swing.JTextField jTextFieldFuente;
    private javax.swing.JTextField jTextFieldNombreA;
    private javax.swing.JTextField jTextFieldPropiedades;
    // End of variables declaration//GEN-END:variables
}
